package com.leedarson.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

/**
 * <p>
 * mysql 代码生成器演示例子
 * </p>
 *
 * @author jobob
 * @since 2018-09-12
 */
public class MysqlGenerator {

	/**
	 *
	 * <p>
	 * 读取控制台内容
	 * </p>
	 */
	public static String scanner(String tip) {
		Scanner scanner = new Scanner(System.in);
		StringBuilder help = new StringBuilder();
		help.append("请输入" + tip + "：");
		System.out.println(help.toString());
		if (scanner.hasNext()) {
			String ipt = scanner.next();
			if (StringUtils.isNotEmpty(ipt)) {
				return ipt;
			}
		}
		throw new MybatisPlusException("请输入正确的" + tip + "！");
	}

	/**
	 * RUN THIS
	 */
	public static void main(String[] args) {
		// 代码生成器
		LeedarsonGenerator mpg = new LeedarsonGenerator();
//		AutoGenerator mpg = new AutoGenerator();

		// 全局配置
		GlobalConfig gc = new GlobalConfig();
//		String projectPath = System.getProperty("user.dir");
		String projectPath = "D:\\springworkspace\\olivier2";
//		gc.setOutputDir(projectPath + "/mybatis-plus-sample-generator/src/main/java");
		gc.setOutputDir(projectPath + "/src/main/java");
		gc.setAuthor("howard");
		gc.setOpen(false);
		gc.setServiceName("%sService");
		mpg.setGlobalConfig(gc);

		// 数据源配置
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setUrl(
				"jdbc:mysql://192.168.8.125:3306/hr?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
		// dsc.setSchemaName("public");
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setUsername("root");
		dsc.setPassword("123");
//		dsc.setUrl(
//				"jdbc:oracle:thin:@192.168.6.228:1521:db1");
//		// dsc.setSchemaName("public");
//		dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
//		dsc.setUsername("usr_oa");
//		dsc.setPassword("hcd623");
		//
		//
		//
		mpg.setDataSource(dsc);

		// 包配置
		PackageConfig pc = new PackageConfig();
//		pc.setModuleName(scanner("模块名"));
//		pc.setModuleName("olivier");
		pc.setModuleName(null);
		pc.setParent("com.leedarson");
		mpg.setPackageInfo(pc);

		// 自定义配置，这里注入的配置会在gnerator类中注入到全局配置的根位置。
		InjectionConfig cfg = new InjectionConfig() {
			@Override
			public void initMap() {
				// to do nothing
				Map<String, Object> map = new HashMap<String, Object>();
				if (map.size() < 1) {
					map.put("mykey", "myvalue");
					map.put("projectname", "olivier2");
					map.put("contextPath", "olivier2.hr");//非要把namespace加入到contextpath里去，呵呵
					this.setMap(map);
				}
			}
		};
		//这个干嘛的
		List<FileOutConfig> focList = new ArrayList<>();
		focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
			@Override
			public String outputFile(TableInfo tableInfo) {
				// 自定义输入文件名称
//				return projectPath + "/mybatis-plus-sample-generator/src/main/resources/mapper/" + pc.getModuleName()
//				+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
				return projectPath + "/src/main/resources/mapper/"
//						+ pc.getModuleName() + "/"
						+ tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
			}
		});
		cfg.setFileOutConfigList(focList);
		mpg.setCfg(cfg);
//        自定义模板
		TemplateConfig templateConfig = new TemplateConfig();
		templateConfig.setXml(null);
		templateConfig.setController("templates/controller.java");
		templateConfig.setEntity("templates/entity.java");
//		templateConfig.setMapper(null);
		templateConfig.setService("templates/service.java");
		// 更改impl不方便，原作者是通过包名生成路径，隐私还是改service把
		templateConfig.setServiceImpl(null);
		mpg.setTemplate(templateConfig);
		//

		// 策略配置
		StrategyConfig strategy = new StrategyConfig();
		strategy.setNaming(NamingStrategy.underline_to_camel);
		strategy.setColumnNaming(NamingStrategy.underline_to_camel);
//        strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");
//        strategy.setEntityLombokModel(true);
//        strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");
//		strategy.setInclude(scanner("表名"));
		// 自定义继承的ServiceImpl类全称，带包名
		strategy.setSuperServiceClass("com.leedarson.service.Service");
//		strategy.setInclude("dept_cost", "role","user_post");// 这里可以是多个 , 填写不存在的表名不会生成文件。
		strategy.setInclude("dept_cost");// 这里可以是多个 , 填写不存在的表名不会生成文件。
//		strategy.setSuperEntityColumns("id");//父类的字段，注释掉之后实体类将不存在该字段
//		strategy.setControllerMappingHyphenStyle(true);//驼峰标识转 - 字符
		strategy.setRestControllerStyle(true);// 更改为restful方案，controller会变更为restcontroller
		strategy.setTablePrefix(pc.getModuleName() + "_");
		mpg.setStrategy(strategy);

		// 选择 freemarker 引擎需要指定如下加，注意 pom 依赖必须有！
		mpg.setTemplateEngine(new LeedarsonTemplateEngine());
		mpg.execute();

	}

}
